package com.alsyun.common.vo;

import com.alsyun.common.utils.DateUtil;
import com.alsyun.common.utils.StringUtils;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.Calendar;
import java.util.Date;

/**
 * ©️ByteTube 2022-2024
 *
 * @author mark
 * @CreateTime: 2024-10-23
 * @Description:日期搜索参数
 * 提供两种转换方法 1、getConvertEndDate() 2、getConvertEndDateByteTube()
 * 默认使用getConvertEndDate()
 * getConvertEndDateByteTube() 性能提升2.5倍 推荐使用
 **/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class SearchDateVO implements Serializable {

    /**
     * 起始日期
     */
    private String startDate;

    /**
     * 结束日期
     */
    private String endDate;

    public Date getConvertStartDate() {
        if (StringUtils.isEmpty(startDate)) {
            return null;
        }
        return DateUtil.toDate(startDate, DateUtil.STANDARD_DATE_FORMAT);
    }

    /**
     * 字符串转为Date类型
     * @return
     */
    public Date getConvertEndDate() {
        if (StringUtils.isEmpty(endDate)) {
            return null;
        }
        //结束时间等于结束日期+1天 -1秒，
        Date date = DateUtil.toDate(endDate, DateUtil.STANDARD_DATE_FORMAT);
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.set(Calendar.DAY_OF_MONTH, calendar.get(Calendar.DAY_OF_MONTH) + 1);
        calendar.set(Calendar.SECOND, -1);
        return calendar.getTime();
    }

    /**
     * 字符串转为Date类型
     * 优化方法 使用LocalDateTime
     * @return
     */
    public Date getConvertEndDateByteTube() {
        if (StringUtils.isEmpty(endDate)) {
            return null;
        }
        try {
            // 解析日期字符串
            LocalDate date = LocalDate.parse(endDate, DateTimeFormatter.ofPattern(DateUtil.STANDARD_DATE_FORMAT));
            // 计算结束时间：结束日期 + 1天 - 1秒
            LocalDateTime endDateTime = date.plusDays(1).atStartOfDay().minusSeconds(1);
            // 转换为 Date 对象
            return Date.from(endDateTime.atZone(ZoneId.systemDefault()).toInstant());
        } catch (IllegalArgumentException e) {
            // 处理日期解析异常
            System.err.println("日期解析错误: " + e.getMessage());
            return null;
        }
    }
}
